在處理大量文件或自動化任務時,萬用字元幫助我們簡化操作,特別是處理大規模文件時,使用簡單的符號來匹配文件名稱或路徑,替代手動輸入文件名稱,讓指令更為簡潔。以下是常見的萬用字元及其應用方式:
*(星號)列出目錄下所有 .txt 結尾的文件
ls *.txt
當需要刪除該目錄底下所有以 .tmp 為結尾的文件時,可以這樣操作:
rm *.tmp
? (問號)匹配所有名稱為 file 開頭,並有一個任意單一字元的 .txt 文件。例如,file1.txt 和 fileA.txt 會被匹配,但 file12.txt 則不會。
ls file?.txt
[] (中括號)以下將會匹配 file1.txt、file2.txt 和 file3.txt,但不會匹配 file4.txt。
ls file[1-3].txt
{} (大括號)將 file1.txt、file2.txt 和 file3.txt 一次性複製到 /backup/ 目錄,提升操作的效率。
cp file{1,2,3}.txt /backup/
[^] (排除匹配)匹配 filed.txt 和 filee.txt 等文件,因為這些文件的名稱中不包含字母 a ~ c。
ls file[^a-c].txt
* 探索文件結構* 可作為 ls 的替代方案。列出當前目錄下的所有文件和子目錄
ls *
將所有子目錄中的文件一併列出
ls ./*/*
$_$_,該變數保存了上一個命令的最後一個參數。假設上一個指令執行了 ls *,$_ 將會保存最後一個文件名稱,我們可以對其進行後續操作。
echo $_
想從文件名 file.txt 中提取首字母 f,可以透過以下指令。從變數 $_ 的值中提取出第一個字元(即 f)。同樣的,可以逐步提取文件名稱中的字元,進行進一步的操作。
${_:0:1}
知道萬用字元的好用之處後,進入到 Lab 進行今天練習吧 ~
Lab - SansAlpha

使用題目給的資訊 ssh 連線進入到環境後,發現是一個可以輸入指令但不多的地方。一些基本的指令都被 ban,系統不認這些指令

開始想辦法利用其他輸入來達到像是 cd、cat 的效果。運用前面提到的萬用字元 * 試試,給出了新的東西 blargh

再試試 */* 看有什麼效果,blargh 是一個檔案夾,裡面有 flag.txt,但我們沒辦法讀取他的內容

使用前面說的 $_,來看看上一個指令執行 * 時,究竟最後一個參數是什麼。結果是一個名為 on-calastran.txt 的文件

這邊參考 Parameter Expansion 的操作,從on-calastran.txt 提取出我們想要的字元,拼湊出 cat 看可不可以就由他印出 flag
${_:0:1}-> {參數:字元位置:字元個數}
所以${_:3:1}將抓取出on-calastran.txt的字元c

依此類推,找出 a 跟 t,接著搭配剛剛我們使用 */ 切換到下一層目錄,進而印出 flag
${_:3:1}${_:4:1}${_:8:1} */*

今天的練習就到這邊,以下是參考資料,請搭配服用:
wildcard character
launch bash without using any letters
Shell Parameter Expansion
取得 shell 上一次命令的參數
內文如有錯誤,還請不吝指教~